package com.kylin.system.service;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.kylin.common.core.exception.CheckException;
import com.kylin.common.core.service.impl.DataServiceImpl;
import com.kylin.system.common.utils.DictUtils;
import com.kylin.system.entity.SysDictData;
import com.kylin.system.mapper.SysDictDataMapper;
import org.springframework.stereotype.Service;

import java.util.Arrays;

/**
 * 字典 业务层处理
 * 
 * @author wuhao
 */
@Service
public class SysDictDataService extends DataServiceImpl<SysDictDataMapper, SysDictData>
{
    /** 字典类型字段值 */
    private static final String DICT_TYPE_FIELD = "dict_type";

    /**
     * 根据字典类型和字典键值查询字典数据信息
     * 
     * @param dictType 字典类型
     * @param dictValue 字典键值
     * @return 字典标签
     */
    public String selectDictLabel(String dictType, String dictValue)
    {
        SysDictData where = new SysDictData();
        where.getQueryWrapper().eq(DICT_TYPE_FIELD, dictType)
                .eq("dict_value", dictValue);
        SysDictData item = mapper.selectOne(where.getQueryWrapper());
        if(item != null) {
            return item.getDictLabel();
        }
        return null;
    }

    /**
     * 批量删除字典数据信息
     * 
     * @param dictCodes 需要删除的字典数据ID
     * @return 结果
     */
    public int deleteDictDataByIds(Long[] dictCodes)
    {
        int row = mapper.deleteBatchIds(Arrays.asList(dictCodes));
        if (row > 0)
        {
            DictUtils.clearDictCache();
        }
        return row;
    }

    /**
     * 新增保存字典数据信息
     * 
     * @param dictData 字典数据信息
     * @return 结果
     */
    public int insertDictData(SysDictData dictData)
    {
        // 校验重复性
        checkDictLabelUnique(dictData);
        checkDictValueUnique(dictData);

        dictData.perInsert();
        int row = mapper.insert(dictData);
        if (row > 0)
        {
            DictUtils.clearDictCache();
        }
        return row;
    }

    /**
     * 修改保存字典数据信息
     * 
     * @param dictData 字典数据信息
     * @return 结果
     */
    public int updateDictData(SysDictData dictData)
    {
        // 校验重复性
        checkDictLabelUnique(dictData);
        checkDictValueUnique(dictData);

        dictData.perUpdate();
        int row = mapper.updateById(dictData);
        if (row > 0)
        {
            DictUtils.clearDictCache();
        }
        return row;
    }


    /**
     * 校验字典标签是否唯一
     *
     * @param dictData 字典信息
     * @return
     */
    public void checkDictLabelUnique(SysDictData dictData)
    {
        Long dictDataId = ObjectUtils.isEmpty(dictData.getId()) ? -1L : dictData.getId();
        SysDictData where = new SysDictData();
        where.getQueryWrapper().eq("dict_label", dictData.getDictLabel())
                .eq(DICT_TYPE_FIELD, dictData.getDictType());
        SysDictData info = mapper.selectOne(where.getQueryWrapper());
        if (ObjectUtils.isNotEmpty(info) && !info.getId().equals(dictDataId))
        {
            throw new CheckException("数据标签已存在");
        }
    }

    /**
     * 校验字典标签值是否唯一
     *
     * @param dictData 字典信息
     * @return 结果
     */
    public void checkDictValueUnique(SysDictData dictData)
    {
        Long dictDataId = ObjectUtils.isEmpty(dictData.getId()) ? -1L : dictData.getId();
        SysDictData where = new SysDictData();
        where.getQueryWrapper().eq("dict_value", dictData.getDictValue())
                .eq(DICT_TYPE_FIELD, dictData.getDictType());
        SysDictData info = mapper.selectOne(where.getQueryWrapper());
        if (ObjectUtils.isNotEmpty(info) && !info.getId().equals(dictDataId))
        {
            throw new CheckException("标签键值已存在");
        }
    }



}
